import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class 解释器 {

    public HashMap<String, 表> 全部表 = new HashMap<>(); // key 是表名，value 是表对象
    public HashMap<String, Object> 全局变量 = new HashMap<>(); // key 是变量名，value 是变量值

    // table 语句
    public void 创建表(String 表名, String 主键, List<String> 列名) {
        var 表 = new 表();
        表.主键 = 主键;
        表.列名 = 列名;
        全部表.put(表名, 表);
    }

    // insert 语句
    public void 插入(String 表名, 行 行) {
        var 表 = 全部表.get(表名);
        if (表 == null) {
            System.out.println("没有这个表：" + 表名);
            return;
        }

        var 主键的值 = 行.值.get(表.主键);
        表.数据.put(主键的值, 行);
    }


    // assign 语句
    public void 赋值(String 变量名, Object 值) {
        全局变量.put(变量名, 值);
    }


    // query
    public Object 查询(String 表名, List<String> 列名) {
        var 表 = 全部表.get(表名);
        var 结果 = new 结果集();

        for (var 当前行 : 表.数据.values()) {
            var 一行 = new ArrayList<String>();
            for (var 列 : 列名) {
                一行.add(当前行.值.get(列));
            }
            结果.数据.add(一行);
        }

        return 结果;
    }


    public Object 查询(String 表名, List<String> 结果列名, String 字段名, Object 字段值) {
        var 表 = 全部表.get(表名);

        if (!表.列名.contains(字段名)) return 结果集.空;

        var 结果 = new 结果集();

        for (var 当前行 : 表.数据.values()) {
            if (当前行.值.containsKey(字段名)) {

                if (字段值 instanceof 结果集 字段结果) {
                    // 查一下结果集中是否包含指定的字段值
                    var 目标 = 当前行.值.get(字段名);
                    var 是否存在 = false;
                    for (var 目标行 : 字段结果.数据) {
                        for (var 目标列 : 目标行) {
                            if (目标列.equals(目标)) {
                                是否存在 = true;
                                break;
                            }
                        }
                    }

                    if (!是否存在) continue;

                } else {
                    if (!当前行.值.get(字段名).equals(字段值)) continue;
                }

                var 一行 = new ArrayList<String>();

                for (var 列 : 结果列名) {
                    一行.add(当前行.值.get(列));
                }

                结果.数据.add(一行);
            }
        }

        return 结果;
    }


    // print
    public void 输出(Object o) {
        if (o instanceof 结果集 结果) {
            for (var 一行 : 结果.数据) {
                for (int i = 0; i < 一行.size(); i++) {
                    if (i > 0) {
                        System.out.print(", ");
                    }
                    System.out.print(一行.get(i));
                }
                System.out.println();
            }
        } else {
            System.out.println(o);
        }
    }
}
